<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('files', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->softDeletes();

            // 用户关联
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('created_by')->nullable();
            $table->unsignedBigInteger('updated_by')->nullable();

            // 基础文件信息
            $table->string('original_name'); // 原始文件名
            $table->string('file_name');     // 存储文件名
            $table->string('file_path');     // 文件路径
            $table->unsignedBigInteger('file_size'); // 文件大小（字节）
            $table->string('file_type', 50); // 文件类型
            $table->string('mime_type');     // MIME类型
            $table->string('file_hash', 128)->nullable(); // 文件哈希值

            // 存储和分类信息
            $table->string('storage_type', 50)->default('local'); // 存储类型
            $table->string('file_category', 50)->default('general'); // 文件分类
            $table->string('file_status', 50)->default('active'); // 文件状态
            $table->string('upload_status', 50)->default('completed'); // 上传状态

            // 上传和处理信息
            $table->unsignedTinyInteger('upload_progress')->default(100); // 上传进度（0-100）
            $table->text('error_message')->nullable(); // 错误信息

            // 元数据
            $table->json('metadata')->nullable(); // 元数据JSON
            $table->json('tags')->nullable();     // 标签JSON

            // 时间控制
            $table->timestamp('expires_at')->nullable(); // 过期时间
            $table->timestamp('last_downloaded_at')->nullable(); // 最后下载时间

            // 统计信息
            $table->unsignedInteger('download_count')->default(0); // 下载次数

            // 版本控制
            $table->unsignedInteger('version')->default(1); // 版本号
            $table->unsignedBigInteger('parent_id')->nullable(); // 父文件ID

            // 访问控制
            $table->boolean('is_public')->default(false); // 是否公开
            $table->string('access_token', 128)->nullable(); // 访问令牌

            // 媒体文件特有字段
            $table->string('thumbnail_path')->nullable(); // 缩略图路径
            $table->string('preview_path')->nullable();   // 预览文件路径
            $table->unsignedInteger('width')->nullable(); // 宽度（像素）
            $table->unsignedInteger('height')->nullable(); // 高度（像素）
            $table->unsignedInteger('duration')->nullable(); // 时长（秒）
            $table->unsignedInteger('pages')->nullable(); // 页数（文档）

            // 编码信息
            $table->string('encoding')->nullable(); // 编码格式
            $table->unsignedInteger('bitrate')->nullable(); // 比特率
            $table->decimal('frame_rate', 5, 2)->nullable(); // 帧率
            $table->string('resolution')->nullable(); // 分辨率
            $table->string('compression')->nullable(); // 压缩格式
            $table->unsignedTinyInteger('quality')->nullable(); // 质量（0-100）

            // 索引
            $table->index(['user_id', 'file_status']);
            $table->index(['file_type', 'file_category']);
            $table->index(['storage_type', 'file_status']);
            $table->index(['is_public', 'expires_at']);
            $table->index(['parent_id']);
            $table->index(['file_hash']);
            $table->index(['created_at']);
            $table->index(['expires_at']);

            // 外键约束
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
            $table->foreign('updated_by')->references('id')->on('users')->onDelete('set null');
            $table->foreign('parent_id')->references('id')->on('files')->onDelete('set null');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('files');
    }
};
